package net.huashitong.ssydt.provider.pk.service;

import net.huashitong.ssydt.pk.entity.SsPkYmdxRank;
import net.huashitong.ssydt.pk.entity.vo.*;
import net.huashitong.ssydt.provider.vo.BaseLongIdPagingVO;

import java.util.List;

/**
 * @author <a href="mailto:yhy23456@163.com">huiyang.yu</a>
 * @since 2017.12.11
 */
public interface YmdxService {
    /**
     * 获取挑战信息(游戏规则)
     *
     * @return
     */
    GameRuleVO get();

    /**
     * 获取剩余免费挑战次数
     *
     * @param userId
     * @return
     */
    Integer getFree(String userId);

    /**
     * 一马当先刷题
     *
     * @param userId
     * @return
     */
    ChallengeRecordVO postChallenge(String userId);

    /**
     * 比赛交卷
     *
     * @param challengeSubmitVO
     * @param userId
     * @return
     */
    ChallengeRecordVO postChallengeSubmit(ChallengeSubmitVO challengeSubmitVO, String userId);

    /**
     * 获取距离比赛结束时间(单位秒)
     *
     * @return
     */
    int getTimer();

    /**
     * 去除错误答案
     *
     * @param challengePrivilegeVO
     * @param userId
     */
    void postRemoveError(ChallengePrivilegeVO challengePrivilegeVO, String userId);

    /**
     * 选中正确答案
     *
     * @param challengePrivilegeVO
     * @param userId
     */
    void postSelectedCorrect(ChallengePrivilegeVO challengePrivilegeVO, String userId);

    /**
     * 获取我的排行
     *
     * @param userId
     * @return
     */
    MyRankVO getMyRank(String userId);


    /**
     * 执行生成排行榜
     */
    void executeRanking();


    /**
     * 一马当先排行榜
     *
     * @param rankingInVO
     * @return
     */
    List<RankingVO> getRanking(RankingInVO rankingInVO);

    /**
     * 获取我的奖牌数
     *
     * @param userId
     * @return
     */
    MyMedalVO getMyMedal(String userId);

    /**
     * 获取奖牌榜列表
     *
     * @param baseLongIdPagingVO
     * @return
     */
    List<MedalVO> getMedalRank(BaseLongIdPagingVO baseLongIdPagingVO);

    /**
     * 计算最终排名和结算
     */
    void calculateFinalRankAndSettlementNotify();

    /**
     * 更新奖牌榜
     */
    void updateMedalRank();

    /**
     * 更新发放用户勋章
     * @param ssPkYmdxRank 排名第一的用户
     */
    void updateUserTaskMedal(SsPkYmdxRank ssPkYmdxRank);
}
